// 路由导航守卫的文件,正常是要将这个文件中的代码书写到router.js中,
// 在这块单独将导航守卫的代码抽离到了单独的模块中,
// 路由导航守卫(路由钩子)
import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css' // 引入进度条样式
// to是要去哪  路由信息对象
// from是从哪来 路由信息对象
// next()直接方向 || next('路径')强制去某个路径 放行函数
// 白名单列表
const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
  NProgress.start() // 开启进度条
  // console.log(store.getters.token)
  const token = store.getters.token
  console.log(to)
  // 如果有token,(除了登录页)想去哪就去哪
  // 如果没有token,(访问没有权限的页面 login 404)哪都去不了,直接去登录
  if (token) {
    // 登录过还要去登录页面,直接去首页
    if (to.path === '/login') {
      next('/') // 被前置导航守卫强制拦截 是不会经过后置导航守卫的,需要在强制拦截后手动再次done()
      NProgress.done()
    } else {
      // 应该是先获取到个人信息和对应的权限列表  再放你进入系统
      // 如果没有个人信息,获取一次即可
      // =====(挖坑)项目后期我们会在这个位置控制用户的权限 个人信息中有roles.menus用户的权限列表
      if (!store.getters.name) {
        const { roles: { menus }} = await store.dispatch('user/getUserInfo')
        console.log(menus) // 登录用户的权限列表
        // 模拟用户登录 渲染用户喜欢的主题色
        const likeTheme = '#6959CD' // 假设likeTheme字段是个人信息中的一个字段,正常应该是获取个人信息中包含likeTheme
        store.dispatch('settings/changeSetting', { key: 'theme', value: likeTheme })
        // 基于menus 筛选出8条动态规则用户对应的那几条
        // const filterRoutes = asyncRoutes.filter(item => {
        //   // console.log(item.children[0].name)
        //   return menus.includes(item.children[0].name)
        // })
        // 将过滤出来的路由规则使用vuex管理(新增)
        const filterRoutes = await store.dispatch('permission/filterMethod', menus)
        // console.log(filterRoutes) // 添加过滤出来的对应的的数组规则
        // router.addRoutes是给路由添加规则的方法/ addRoutes有点小问题
        router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }])
        // addRoutes问题, 路由规则初次加载的时候,是没有的新增的路由规则,
        // 登录成功后才新加的规则 导航守卫读取不到后加的规则 需要手动告诉导航守卫 放行去哪个路由地址
        next(to.fullPath)
      }
      next()
    }
  } else {
    // 没有登录可以访问 login 和404
    if (whiteList.includes(to.path)) {
      next()
    } else { // 反之去登录
      next('/login') // 被前置导航守卫强制拦截 是不会经过后置导航守卫的
      NProgress.done()
    }
  }
})

router.afterEach((to, form) => {
  console.log('后置守卫经过')
  NProgress.done() // 关闭进度条
})
